package com.javaee.lu99.ui.socket;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;

public class NioServerHandler extends SimpleChannelInboundHandler<Object> {
    //  private static final Logger logger = LoggerFactory.getLogger(ServerListenerHandler.class);

    /**
     * 读取客户端发来的数据
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
        String[] data = msg.toString().split("id=");
        if (data != null && data.length > 1) {
            String[] data1 = data[1].split(";");
            String id = data1[0];
            if (ServerListener.map.get(id) != null && ServerListener.map.get(id).equals(ctx)) {
                //接收到服务端发来的数据进行业务处理
                //System.out.println("接收数据成功！" + DateUtils.dateToString(new Date()));
            } else {
                //接收到服务端发来的数据进行业务处理
                //如果map中没有此ctx 将连接存入map中
                ServerListener.map.put(id, ctx);
//                System.out.println("连接成功，加入map管理连接！"+"mn:" +mn+" " +""+ DateUtils.dateToString(new Date()));
            }
        } else {
            //System.out.println(""+"不是监测数据"+ msg.toString()+" "+ DateUtils.dateToString(new Date()));
        }
        // ctx.writeAndFlush("Received your message : " + msg.toString());
    }


    /*
     * 读取完毕客户端发送过来的数据之后的操作
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        System.out.println("服务端接收数据完毕..");
        //  ctx.channel().write("");
        //  ctx.channel().flush();
    }

    /**
     * 客户端主动断开服务端的链接,关闭流
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println(ctx.channel().localAddress().toString() + " 通道不活跃！");
        removeChannnelMap(ctx);
        // 关闭流
//        ctx.close();
    }

    /**
     * 客户端主动连接服务端
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // System.out.println("RemoteAddress"+ ctx.channel().remoteAddress() + " active !");
        // System.out.println("msg"+ ctx.m + " active !");
        System.out.println("连接成功！");
        super.channelActive(ctx);
    }

    /**
     * 发生异常处理
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.printStackTrace();
        // logger.error("连接异常,连接异常："+ DateUtils.dateToString(new Date())+cause.getMessage(), cause);
        ctx.fireExceptionCaught(cause);
        //   removeChannnelMap(ctx);
        ctx.close();
    }

    /**
     * 删除map中ChannelHandlerContext
     */
    private void removeChannnelMap(ChannelHandlerContext ctx) {
        for (String key : ServerListener.map.keySet()) {
            if (ServerListener.map.get(key) != null && ServerListener.map.get(key).equals(ctx)) {
                ServerListener.map.remove(key);
            }
        }
    }

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        super.userEventTriggered(ctx, evt);
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent event = (IdleStateEvent) evt;
            if (event.state().equals(IdleState.READER_IDLE))
                ctx.close();
            //标志该链接已经close 了
        }
    }
}